/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.ejb.EJBAdminSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.datamodel.UsuariosDynamicDataModel;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.dto.UsuarioDto;
import co.com.claro.administracionSolicitudes.entity.Usuario;
import co.com.claro.administracionSolicitudes.entity.UsuariosPorAplicaciones;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 *
 * @author usuario
 */
@ManagedBean
@ViewScoped
public class CertificarUsuarioBean {

    @EJB
    private EJBAdminSolicitudesLocal localAdminSol;
    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;
    /**
     * Lista con los usuarios que pertenecen a una gerencia
     */
//    private List<Usuario> usuarios;
    private UsuariosDynamicDataModel usuarios;

    private List<UsuariosPorAplicaciones> aplicacionesUsuario;

    private List<UsuariosPorAplicaciones> aplicacionesCertificadas;
    private List<UsuariosPorAplicaciones> aplicacionesNoCertificadas;

    private String mensaje;

    private int filas = 10;

    private String columnaSorteadaUsuarios;
    private boolean ascendienteUsuarios;
    private String columnaSorteadaAplicaciones;
    private boolean ascendienteAplicaciones;

    private final static String COL_DEFAULT_SORT_USUARIOS = "nombres";

    private final static String COL_DEFAULT_SORT_APLICACIONES = "idAplicacion.nombre";
    private final static String COL_USERNAME_APLICACIONES = "username";
    private final static String COL_TIPO_USUARIO_APLICACIONES = "idTipoUsuario.nombre";

    /**
     * Creates a new instance of CertificarUsuarioBean
     */
    public CertificarUsuarioBean() {
    }

    @PostConstruct
    public void inicializarValores() {

        columnaSorteadaUsuarios = COL_DEFAULT_SORT_USUARIOS;
        ascendienteUsuarios = true;
        columnaSorteadaAplicaciones = COL_DEFAULT_SORT_APLICACIONES;
        ascendienteAplicaciones = true;

        llenarUsuarios();
    }

    //**************************** MÉTODOS PROPIOS DEL BEAN ********************
    /**
     * Método que obtiene el id del objeto contenido dentro del data table
     *
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private Usuario obtenerUsuario(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent componente = event.getComponent().findComponent("idUsuarioOutputText");
        Integer id = (Integer) componente.getValueExpression("value").getValue(context.getELContext());
        return localDatabase.findUsuarioById(id);
    }

    private void llenarUsuarios() {
        UsuarioDto dto = new UsuarioDto();

        dto.setIdGerencia(sesionBean.getUsuario().getGerencia().getIdGerencia());
        dto.setActivo(EstadoActividadEnum.ACTIVO.getId());
        dto.setAscendiente(ascendienteUsuarios);
        dto.setCampoSorteado(columnaSorteadaUsuarios);

        usuarios = new UsuariosDynamicDataModel(localDatabase, dto);
    }

    //************************** EVENTOS PROPIOS DEL EJB ************************
    /**
     * Evento que envía a borrar la entidad seleccionada por el usuario en la
     * tabla de la interfaz gráfica
     *
     * @param event, la fila que seleccionó el usuario
     */
    public void eliminarUsuario(ActionEvent event) {
        Usuario usuario = obtenerUsuario(event);
        usuario.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localAdminSol.generarSolicitudMasivaBorradoUsuario(usuario);
//            localDatabase.borradoLogicoUsuario(usuario);
        } catch (ClaroException ex) {
            mensaje = ex.getMessage();
        }
        llenarUsuarios();
    }

    public void certificarUsuario() {
        Usuario aprobador = sesionBean.getUsuario();
        try {
            localAdminSol.certificarUsuario(aplicacionesUsuario, aplicacionesCertificadas, aprobador);
            mensaje = ResourceBundle.getBundle("mensajes").getString("usuarioCertificadoOk");
        } catch (ClaroException ex) {
            mensaje = ex.getMessage();
        }
    }

    public void llenarAplicacionesUsuario(Integer idUsuario) {
        aplicacionesUsuario = localDatabase.findAplicacionesActivoByUsuario(EstadoActividadEnum.ACTIVO.getId(), idUsuario);
        aplicacionesCertificadas = new ArrayList<UsuariosPorAplicaciones>();
        aplicacionesNoCertificadas = new ArrayList<UsuariosPorAplicaciones>();
    }

    public boolean usuarioCertificado(Usuario usuario) {
        List<UsuariosPorAplicaciones> aplUsuario = usuario.getUsuariosPorAplicacionesList();

        for (UsuariosPorAplicaciones app : aplUsuario) {
            if (app.getCertificacionUsuario() == null && app.getActivo() == EstadoActividadEnum.ACTIVO.getId()) {
                return false;
            }
        }
        return true;
    }

    public boolean aplicacionCertificada() {
        return true;
//        FacesContext ctx = FacesContext.getCurrentInstance();
//        UIComponent component = event.getComponent().findComponent("idUsuarioAplicacion");
//        Integer idUsuarioAplicacion = (Integer) component.getValueExpression("value").getValue(ctx.getELContext());

//        UsuariosPorAplicaciones uxa = localDatabase.findUsuarioPorAplicaciones(idUsuarioAplicacion);
//        return uxa.getCertificacionUsuario() != null;
    }

    public void ordenarAplicaciones() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteadaAplicaciones.equals(property)) {
                ascendienteAplicaciones = !ascendienteAplicaciones;
            } else {
                columnaSorteadaAplicaciones = property;
                ascendienteAplicaciones = true;
            }
        }

        if (columnaSorteadaAplicaciones != null && !columnaSorteadaAplicaciones.isEmpty()) {
            if (columnaSorteadaAplicaciones.equals(COL_DEFAULT_SORT_APLICACIONES)) {
                if (ascendienteAplicaciones) {
                    Collections.sort(aplicacionesUsuario, new Comparator<UsuariosPorAplicaciones>() {

                        @Override
                        public int compare(UsuariosPorAplicaciones o1, UsuariosPorAplicaciones o2) {
                            return o1.getIdAplicacion().getNombre().compareTo(o2.getIdAplicacion().getNombre());
                        }
                    });
                } else {
                    Collections.sort(aplicacionesUsuario, new Comparator<UsuariosPorAplicaciones>() {

                        @Override
                        public int compare(UsuariosPorAplicaciones o1, UsuariosPorAplicaciones o2) {
                            return o2.getIdAplicacion().getNombre().compareTo(o1.getIdAplicacion().getNombre());
                        }
                    });
                }
            } else if (columnaSorteadaAplicaciones.equals(COL_TIPO_USUARIO_APLICACIONES)) {
                if (ascendienteAplicaciones) {
                    Collections.sort(aplicacionesUsuario, new Comparator<UsuariosPorAplicaciones>() {

                        @Override
                        public int compare(UsuariosPorAplicaciones o1, UsuariosPorAplicaciones o2) {
                            return o1.getIdTipoUsuario().getNombre().compareTo(o2.getIdTipoUsuario().getNombre());
                        }
                    });
                } else {
                    Collections.sort(aplicacionesUsuario, new Comparator<UsuariosPorAplicaciones>() {

                        @Override
                        public int compare(UsuariosPorAplicaciones o1, UsuariosPorAplicaciones o2) {
                            return o2.getIdTipoUsuario().getNombre().compareTo(o1.getIdTipoUsuario().getNombre());
                        }
                    });
                }
            } else if (columnaSorteadaAplicaciones.equals(COL_USERNAME_APLICACIONES)) {
                if (ascendienteAplicaciones) {
                    Collections.sort(aplicacionesUsuario, new Comparator<UsuariosPorAplicaciones>() {

                        @Override
                        public int compare(UsuariosPorAplicaciones o1, UsuariosPorAplicaciones o2) {
                            return o1.getUsername().compareTo(o2.getUsername());
                        }
                    });
                } else {
                    Collections.sort(aplicacionesUsuario, new Comparator<UsuariosPorAplicaciones>() {

                        @Override
                        public int compare(UsuariosPorAplicaciones o1, UsuariosPorAplicaciones o2) {
                            return o2.getUsername().compareTo(o1.getUsername());
                        }
                    });
                }
            }
        }
    }

    public void ordenarUsuarios() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteadaUsuarios.equals(property)) {
                ascendienteUsuarios = !ascendienteUsuarios;
            } else {
                columnaSorteadaUsuarios = property;
                ascendienteUsuarios = true;
            }
        }

        System.out.println(ascendienteUsuarios);

        llenarUsuarios();
    }

    public boolean paginadoUsuarios() {
        return usuarios.getTotalCount() > filas;
    }

    public boolean paginadoAplicaciones() {
        return aplicacionesUsuario.size() > filas;
    }

    //+++++++++++++++++++++++ GETTERS Y SETTERS +++++++++++++++++++++++++++++++++++
    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public UsuariosDynamicDataModel getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(UsuariosDynamicDataModel usuarios) {
        this.usuarios = usuarios;
    }

    public List<UsuariosPorAplicaciones> getAplicacionesUsuario() {
        return aplicacionesUsuario;
    }

    public void setAplicacionesUsuario(List<UsuariosPorAplicaciones> aplicacionesUsuario) {
        this.aplicacionesUsuario = aplicacionesUsuario;
    }

    public List<UsuariosPorAplicaciones> getAplicacionesCertificadas() {
        return aplicacionesCertificadas;
    }

    public void setAplicacionesCertificadas(List<UsuariosPorAplicaciones> aplicacionesCertificadas) {
        this.aplicacionesCertificadas = aplicacionesCertificadas;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public int getFilas() {
        return filas;
    }

    public boolean isAscendienteUsuarios() {
        return ascendienteUsuarios;
    }

    public boolean isAscendienteAplicaciones() {
        return ascendienteAplicaciones;
    }

}
